package com.monster.json;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import lombok.Getter;

import java.text.SimpleDateFormat;

/**
 * json数据工具类
 *
 * @author kuang
 */
public class JsonUtils {
    /**
     * 最终操作对象
     **/
    @Getter
    private final static ObjectMapper objectMapper = new ObjectMapper();

    /** 初始化的一些设置 **/
    static {
        // 默认非空不输出
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        //序列化的时候序列对象的所有属性
        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        //反序列化的时候如果多了其他属性,不抛出异常
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        //如果是空对象的时候,不抛异常
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        //设置可用单引号
        objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
        //取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        // 设置时间的转换格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 对象转json字符串
     *
     * @param obj 对象
     * @return json字符串
     */
    public static String toJson(Object obj) {
        try {
            return obj instanceof String ? obj.toString() : objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 对象转json字符串(格式化输出)
     *
     * @param obj 对象
     * @return json字符串
     */
    public static String toFormatJson(Object obj) {
        try {
            return obj instanceof String ? obj.toString() : objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * json转对象
     *
     * @param json     json字符串
     * @param objClass 需要转换的类型
     * @param <T>      泛型
     * @return 转换后的数据
     */
    public static <T> T readValue(String json, Class<?> objClass) {
        try {
            return (T) objectMapper.readValue(json, objClass);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}
